Rails console improvements, assertionless tests reporting and more! | This Week in Rails
railtiesに関する変更です
IRBのバージョンをv1.13に更新しました
このバージョンのIRBで提供されている Extend IRB の機能を用いて5つのコマンド helper, controller, new_session, app, reload! を実装し直しています これらのコマンドは、変更前はモンキーパッチを充てる形で拡張されており、ヘルプメッセージにも出てきていませんでした
今回の変更で Extend IRB にしたがって実装したことで、ヘルプメッセージにも記載されるようになりました
ActiveSupportに関する変更です
アサーションが一度も呼ばれないテストコードが実行された場合に例外を上げることができるようになりました
アサーションが一度も呼ばれない場合があるテストコードとは、具体的には次のようなコードです
code:rb
def test_active
active_users = User.active.to_a
active_users.each do |user|
assert user.active?
end
end
このテストコードは active_users が0件の場合には一度もアサーションが呼ばれません
そして、テストは通ってしまいます
つまり active_users が0件の場合にはアサーションの内容に関わらず常にテストが通ってしまうことになります
こういったテストを検知できるように、ActiveSupportにオプションが追加されました
code:config/environments/test.rb
config.active_support.assertionless_tests_behavior = :raise # also available :ignore and :log
raise を指定すると、アサーションが一度も呼ばれないテストコードが実行された場合に例外が上がります
log を指定すると、アサーションが一度も呼ばれないテストコードが実行された場合にログが出力されます
ignore を指定すると、アサーションが一度も呼ばれないテストコードが実行されても何も起きません
ActiveRecordに関する変更です
PostgreSQLのアダプターにdate型のデコーダーが追加されました
具体的には、これまで、SQLでDate型にキャストしても、ActiveRecordでSelectするとString型になってしまっていました
code:before.rb
ActiveRecord::Base.connection.select_value("select '2024-01-01'::date").class
今回の変更により、SQLでDate型にキャストしたらActiveRecordでの結果もDate型になります
code:after.rb
ActiveRecord::Base.connection.select_value("select '2024-01-01'::date").class
Mysql2アダプターにも同様の処理がすでに実装されており、今回の変更によりDate型の変換に関してはPostgreSQLアダプターの機能がMysql2アダプターの機能に追いついた、ということです。